package com.csun.cmny.provider.controller.admin;

import com.csun.cmny.config.properties.CmnyProperties;
import com.csun.cmny.core.annotation.ValidateAnnotation;
import com.csun.cmny.core.support.BaseController;
import com.csun.cmny.provider.device.csun.camera.CameraMessageHandler;
import com.csun.cmny.provider.device.csun.camera.entity.*;
import com.csun.cmny.provider.model.constant.DeviceConstant;
import com.csun.cmny.provider.model.domain.*;
import com.csun.cmny.provider.model.dto.camera.BindCsunCameraLocationDto;
import com.csun.cmny.provider.model.dto.camera.CsunCameraQueryDto;
import com.csun.cmny.provider.model.dto.camera.UnalertAeraPlanDto;
import com.csun.cmny.provider.model.dto.device.DmcEditDeviceDto;
import com.csun.cmny.provider.model.enums.device.DeviceStatusEnum;
import com.csun.cmny.provider.model.enums.device.DmcDeviceTypeEnum;
import com.csun.cmny.provider.model.vo.OldmanBedRoomBuildingVo;
import com.csun.cmny.provider.model.vo.RoomBuildingVo;
import com.csun.cmny.provider.model.vo.csuncamera.CsunCameraVo;
import com.csun.cmny.provider.model.vo.csuncamera.GroupCameraVo;
import com.csun.cmny.provider.model.vo.csuncamera.UnalertAeraPlanVO;
import com.csun.cmny.provider.resolver.CmnyMessageSource;
import com.csun.cmny.provider.service.*;
import com.csun.cmny.provider.validator.DmcDeviceEditValidator;
import com.csun.cmny.util.PublicUtil;
import com.csun.cmny.util.RedisKeyUtil;
import com.csun.cmny.util.wrapper.WrapMapper;
import com.csun.cmny.util.wrapper.Wrapper;
import com.github.pagehelper.PageInfo;
import com.google.common.base.Preconditions;
import com.google.common.collect.Maps;
import io.netty.channel.Channel;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.springframework.beans.BeanUtils;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.MediaType;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import javax.annotation.Resource;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Auther: chisj chisj@foxmal.com
 * @Date: 2019-09-02 14:05
 * @Description: the class dmc csun camera controller
 */
@Slf4j
@RestController
@RequestMapping(value = "/camera", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public class DmcCsunCameraController extends BaseController {

    @Resource
    private CmnyMessageSource cmnyMessageSource;
    @Resource
    private DmcDeviceService dmcDeviceService;
    @Resource
    private DmcCsunCameraLocationService dmcCsunCameraLocationService;
    @Resource
    private RedisTemplate<String, Object> redisTemplate;
    @Resource
    private CameraMessageHandler cameraMessageHandler;
    @Resource
    private CmnyProperties cmnyProperties;
    @Resource
    private DmcCsunCameraPictureService dmcCsunCameraPictureService;
    @Resource
    private DmcCsunCameraAlertVideoService dmcCsunCameraAlertVideoService;
    @Resource
    private DmcDeviceOnlineRecordService dmcDeviceOnlineRecordService;
    @Resource
    private DmcCsunCameraUnalertAreaPlanService dmcCsunCameraUnalertAreaPlanService;
    @Resource
    private DmcCsunCameraWebRtcService dmcCsunCameraWebRtcService;
    @Resource
    private DmcWebRtcMacService dmcWebRtcMacService;

    /**
     * 查询守护佳摄像头
     *
     * @param csunCameraQueryDto    the csun camera query dto
     *
     * @return  the wrapper.
     */
    @RequestMapping(value = "/queryListWithPage", method = RequestMethod.POST)
    public Wrapper queryListWithPage(@RequestBody CsunCameraQueryDto csunCameraQueryDto) {

        csunCameraQueryDto.setGroupId(getLoginAuthDto().getGroupId());
        csunCameraQueryDto.setDeviceType(DmcDeviceTypeEnum.CSUN_CAMERA.getIndex());


        List<CsunCameraVo> csunCameraVoList = dmcCsunCameraLocationService
                .queryListWithPage(csunCameraQueryDto);
        OldmanBedRoomBuildingVo obv, bov;
        RoomBuildingVo rbv;
        for (CsunCameraVo ccv : csunCameraVoList) { // 获取实时的位置
            CsunCameraData csunCameraData = (CsunCameraData) redisTemplate.opsForValue()
                    .get(RedisKeyUtil.getCsunCameraKey(ccv.getDeviceNo()));
            if (PublicUtil.isEmpty(csunCameraData)) {
                ccv.setStatus(DeviceStatusEnum.OFFLINE.getKey());
            } else {
                ccv.setStatus(csunCameraData.getStatus());
            }
            if (ccv.isBind()) {
                switch (ccv.getBindType()) {
                    case DeviceConstant.DEVICE_BIND_TYPE_OLDMAN :
                        obv = (OldmanBedRoomBuildingVo) redisTemplate
                                .opsForValue().get(RedisKeyUtil.getOmcOldmanId(ccv.getOldmanId()));
                        if (PublicUtil.isNotEmpty(obv)) {
                            ccv.setOldmanName(obv.getOldmanName());
                            if (PublicUtil.isNotEmpty(obv.getRoomNo()) && PublicUtil.isNotEmpty(obv.getBedNo())) {
                                ccv.setLocation(obv.getRoomNo() + "-" + obv.getBedNo());
                            } else {
                                ccv.setLocation("--");
                            }
                        }
                        break;
                    case DeviceConstant.DEVICE_BIND_TYPE_BED :
                        bov = (OldmanBedRoomBuildingVo) redisTemplate
                                .opsForValue().get(RedisKeyUtil.getOmcBedId(ccv.getBedId()));
                        if (PublicUtil.isNotEmpty(bov)) {
                            ccv.setOldmanName(bov.getOldmanName());
                            if (PublicUtil.isNotEmpty(bov.getRoomNo()) && PublicUtil.isNotEmpty(bov.getBedNo())) {
                                ccv.setLocation(bov.getRoomNo() + "-" + bov.getBedNo());
                            } else {
                                ccv.setLocation("--");
                            }
                            ccv.setOldmanId(bov.getOldmanId());
                        }
                        break;
                    case DeviceConstant.DEVICE_BIND_TYPE_ROOM :
                        rbv = (RoomBuildingVo) redisTemplate
                                .opsForValue().get(RedisKeyUtil.getOmcRoomId(ccv.getRoomId()));
                        if (PublicUtil.isNotEmpty(rbv)) {
                            ccv.setLocation(rbv.getRoomNo());
                        } else {
                            ccv.setLocation("--");
                        }
                        break;
                    case DeviceConstant.DEVICE_BIND_TYPE_LIFE :
                        rbv = (RoomBuildingVo) redisTemplate
                                .opsForValue().get(RedisKeyUtil.getOmcRoomId(ccv.getRoomId()));
                        if (PublicUtil.isNotEmpty(rbv)) {
                            ccv.setLocation(rbv.getRoomNo());
                            ccv.setBuildingName(rbv.getBuildingName());
                            ccv.setFloorNo(rbv.getFloorNo());
                            ccv.setRoomNo(rbv.getRoomNo());
                            ccv.setOldmanId(rbv.getOldmanId());
                            ccv.setOldmanName(rbv.getOldmanName());
                        } else {
                            ccv.setLocation("--");
                        }
                        break;
                }
            }
            if (ccv.getLocation() == null) {
                ccv.setLocation("");
            }
        }

       // return WrapMapper.ok(new PageInfo<>(csunCameraVoList));
        return WrapMapper.wrap(Wrapper.SUCCESS_CODE,cmnyMessageSource.getMessage("operation.success", null),new PageInfo<>(csunCameraVoList));
    }

    /**
     * 添加守护佳摄像头
     *
     * @param dmcEditDeviceDto  the dmc edit device dto
     * @param br                the binding result
     *
     * @return  the wrapper.
     */
    @ValidateAnnotation
    @RequestMapping(value = "/add", method = RequestMethod.POST)
    public Wrapper add(@Validated @RequestBody DmcEditDeviceDto dmcEditDeviceDto,
                       BindingResult br) {

        DmcDevice dmcDevice = new DmcDevice();

        BeanUtils.copyProperties(dmcEditDeviceDto, dmcDevice);
        dmcDevice.setDeviceType(DmcDeviceTypeEnum.CSUN_CAMERA.getIndex());

        Integer result = dmcDeviceService.addDevice(dmcDevice, getLoginAuthDto());
        if (result < 1) {
            return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                    .getMessage("operation.failed", null));
        }

        return WrapMapper.wrap(Wrapper.SUCCESS_CODE,cmnyMessageSource.getMessage("operation.success", null),result);

    }

    /**
     * 修改守护佳摄像头
     *
     * @param dmcEditDeviceDto  the dmc edit device dto
     * @param br                the binding result
     *
     * @return  the wrapper.
     */
    @RequestMapping(value = "/edit", method = RequestMethod.POST)
    public Wrapper edit(@Validated(value = {DmcDeviceEditValidator.class})
                            @RequestBody DmcEditDeviceDto dmcEditDeviceDto,
                        BindingResult br) {

        DmcDevice dmcDevice = new DmcDevice();
        BeanUtils.copyProperties(dmcEditDeviceDto, dmcDevice);
        dmcDevice.setDeviceType(DmcDeviceTypeEnum.CSUN_CAMERA.getIndex());

        DmcDevice dmcDeviceOld = dmcDeviceService.selectByKey(dmcEditDeviceDto.getId());

        Integer result = dmcDeviceService.editDevice(dmcDevice, getLoginAuthDto());
        if (result < 1) {
            return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                    .getMessage("operation.failed", null));
        } else {
            // 判断是否有修改deviceNo
            if (!dmcDeviceOld.getDeviceNo().equals(dmcEditDeviceDto.getDeviceNo())) {
                // 删除旧的redisKey(deviceNo)
                String redisKey = RedisKeyUtil.getCsunCameraKey(dmcDeviceOld.getDeviceNo());
                CsunCameraData csunCameraData = (CsunCameraData) redisTemplate.opsForValue().get(redisKey);
                if (PublicUtil.isNotEmpty(csunCameraData)) {
                    // 删除旧的
                    redisTemplate.delete(redisKey);
                    // 添加新的
                    csunCameraData.setDeviceNo(dmcEditDeviceDto.getDeviceNo());
                    csunCameraData.setStatus(DeviceStatusEnum.OFFLINE.getKey());   // 设备下线
                    redisKey = RedisKeyUtil.getCsunCameraKey(dmcEditDeviceDto.getDeviceNo());
                    redisTemplate.opsForValue().set(redisKey, csunCameraData);
                }
            }
        }

       // return WrapMapper.ok(result);
        return WrapMapper.wrap(Wrapper.SUCCESS_CODE,cmnyMessageSource.getMessage("operation.success", null),result);
    }

    /**
     * 根据Id删除守护佳摄像头
     *
     * @param id    the id
     *
     * @return  the wrapper.
     */
    @RequestMapping(value = "/deleteById/{id}", method = RequestMethod.POST)
    public Wrapper deleteDmcCsunCameraById(@PathVariable Long id) {

        Integer result = dmcCsunCameraLocationService.deleteById(id);

        if (result < 1) {
            return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                    .getMessage("operation.failed", null));
        }

        DmcDeviceOnlineRecord dmcDeviceOnlineRecord = new DmcDeviceOnlineRecord();
        dmcDeviceOnlineRecord.setDeviceId(id);
        int delete = dmcDeviceOnlineRecordService.delete(dmcDeviceOnlineRecord);
       // return WrapMapper.ok(result);
        return WrapMapper.wrap(Wrapper.SUCCESS_CODE,cmnyMessageSource.getMessage("operation.success", null),result);
    }

    /**
     * 绑定守护佳摄像头
     *
     * @param bindCsunCameraLocationDto the bind csun camera location dto
     * @param br    the binding result
     *
     *
     * @return  the wrapper
     */
    @RequestMapping(value = "/bind", method = RequestMethod.POST)
    public Wrapper bind(@Validated @RequestBody BindCsunCameraLocationDto
                                                      bindCsunCameraLocationDto, BindingResult br) {
        Integer result = dmcCsunCameraLocationService
                .bind(bindCsunCameraLocationDto, getLoginAuthDto());
        if (result < 1) {
            return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                    .getMessage("operation.failed", null));
        }

       // return WrapMapper.ok(result);
        return WrapMapper.wrap(Wrapper.SUCCESS_CODE,cmnyMessageSource.getMessage("operation.success", null),result);
    }

    /**
     * 解绑守护佳摄像头
     *
     * @param deviceId  the device id
     *
     * @return the wrapper.
     */
    @RequestMapping(value = "/untied/{deviceId}", method = RequestMethod.POST)
    public Wrapper untied(@PathVariable Long deviceId) {

        Integer result = dmcCsunCameraLocationService.untied(deviceId);

        if (result < 1) {
            return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                    .getMessage("operation.failed", null));
        }

        DmcDeviceOnlineRecord dmcDeviceOnlineRecord = new DmcDeviceOnlineRecord();
        dmcDeviceOnlineRecord.setDeviceId(deviceId);
        int delete = dmcDeviceOnlineRecordService.delete(dmcDeviceOnlineRecord);
       // return WrapMapper.ok(result);
        return WrapMapper.wrap(Wrapper.SUCCESS_CODE,cmnyMessageSource.getMessage("operation.success", null),result);
    }

    /**
     * 摄像头拍照
     */
    @RequestMapping(value = "/takePicture", method = RequestMethod.POST)
    public Wrapper takePicture(String deviceNo) {

        String result = cameraMessageHandler.sendPictureMsg(deviceNo);

        System.out.println("====> chisj task id = " + result);

        switch (result) {
            case "-1" :
                return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                        .getMessage("csun.camera.bind.error", null));
            case "-2" :
                return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                        .getMessage("csun.camera.connect.close", null));
            case "-3" :
                return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                        .getMessage("csun.camera.off.line", null));
        }

        // 获取拍照是否成功
        for (int i = 0; i < 10; i++) {

            // 获取图片是否拍照成功
            CsunCameraPictureAckMsg msg = (CsunCameraPictureAckMsg) redisTemplate.opsForValue()
                    .get(RedisKeyUtil.getCsunCameraTask(result));

            if (PublicUtil.isNotEmpty(msg)) {

                // 校验图片是否完整
                try {
                    if (isImage(msg.getPicture())) {
                        // 替换picture
                        msg.setPicture(cmnyProperties.getNetty().getCamera().getPictureShow() + "?deviceNo=" + deviceNo);
                        return WrapMapper.ok(msg);
                    } else {
                        return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                                .getMessage("csun.camera.take.picture.error", null));
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }

            } else{
                log.info("====> chisj msg is null");
            }

            try {
                Thread.sleep(1000);
            } catch (Exception e) {
                e.printStackTrace();
            }

        }

        // 拍照失败
        return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                .getMessage("csun.camera.take.picture.error", null));
    }

    @Test
    public void testImage() {

//        String picture = "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";
        String picture = "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SGf/2Q==U1weOKM0LTsUhiZNA4pTxSdaAHA0nAPFL0FMzmgB9FIDRSGf/9k=WpCGc7m6VlXVqUHmryO49Ks6bejIhkPX7p/pS8h2vqa4PHFLn86FpcUDEyaBSnik60APBpvAJpRwKbnJoAfRTQcUUhn/2Q==jbedDvX76/qKklkCnjrVdrhnO1atRJcuxWsL0wZjb7h6e1akO523N0rJurVkHmjkd6tabejIhkPX7p/pR5Ba+prA8cUufWkWnYpDEzSijpSdaAHg03ABOKUcU3OaBj6KQGikB//ZQA8GkwAeKBwKaTmgY+imqaKQz//Z";
        try {

            boolean flag = isImage(picture);

            log.info("flag = " + flag);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 校验图片
     *
     * @param picture
     * @return
     */
    private boolean isImage(String picture) throws Exception {

        if (PublicUtil.isEmpty(picture)) {
            return false;
        } else {
            ByteArrayInputStream byteArrayInputStream = null;
            try {
                BASE64Decoder decoder = new BASE64Decoder();
                byte[] byteArray = decoder.decodeBuffer(picture);
                byteArrayInputStream = new ByteArrayInputStream(byteArray);
                BufferedImage bufferedImage = ImageIO.read(byteArrayInputStream);
                if (bufferedImage == null) {
                    log.error("====> chisj 拍照失败...");
                    return false;
                }
                log.info("====> chisj 拍照成功...");

                // File outputfile  = new File("G:/lu-1.jpg");
                // ImageIO.write(bufferedImage,"jpg",outputfile);

                // String image = imageToBase64("G:/lu-1.jpg");


                // log.info("picture = {}", picture);
                // log.info("image = {}", image);
            } finally {
                if (byteArrayInputStream != null) {
                    byteArrayInputStream.close();
                }
            }
        }

        return true;
    }

    public String imageToBase64(String imgUrl) {

        InputStream in = null;

        byte data[] = null;

        try {
            in = new FileInputStream(imgUrl);
            data = new byte[in.available()];
            in.read();
            in.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        BASE64Encoder encoder = new BASE64Encoder();

        return encoder.encode(data);
    }

    /**
     * 通过webrtc查看摄像头实时视频 -- 自研
     */
    @RequestMapping(value = "/live", method = RequestMethod.POST)
    public Wrapper live(String deviceNo) {

        CsunCameraData csunCameraData = (CsunCameraData) redisTemplate
                .opsForValue().get(RedisKeyUtil.getCsunCameraKey(deviceNo));
        if (PublicUtil.isEmpty(csunCameraData)) {
            log.error("===> 守护佳摄像头[{}]尚未绑定...", deviceNo);
            return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                    .getMessage("csun.camera.bind.error", null));
        }

        Channel channel = CsunCameraConstant.CAMERA_CHANNEL_MAP.get(deviceNo);
        if (channel != null) {
            if (channel.isActive()) {

            } else {
                return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                        .getMessage("csun.camera.connect.close", null));
            }
        } else {
            log.error("====> csun camera [{}] off line...", deviceNo);
            return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                    .getMessage("csun.camera.off.line", null));
        }

        String host = cmnyProperties.getNetty().getCamera().getWebrtcHost();

        Map map = new HashMap();

        map.put("toclientid", deviceNo);
        map.put("host", host);
        map.put("conmode", "live");
        map.put("consource", "MainStream");

        return WrapMapper.wrap(Wrapper.SUCCESS_CODE,
                cmnyMessageSource.getMessage("operation.success", null), map);
    }

    /**
     * 通过webrtc查看摄像头录像视频 -- 自研
     */
    @RequestMapping(value = "/play", method = RequestMethod.POST)
    public Wrapper play(Long alertId) {

        if (PublicUtil.isEmpty(alertId)) {
            return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                    .getMessage("device.alert.id.null", null));
        }

        DmcCsunCameraAlertVideo dmcCsunCameraAlertVideo = dmcCsunCameraAlertVideoService.selectByKey(alertId);
        if (PublicUtil.isEmpty(dmcCsunCameraAlertVideo)) {
            return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                    .getMessage("device.alert.video.null", null));
        }

        String deviceNo = dmcCsunCameraAlertVideo.getDeviceNo();

        // 下发webrtc推流地址
        String videoFileName = dmcCsunCameraAlertVideo.getVideoFileName();
        String webrtcHost = cmnyProperties.getNetty().getCamera().getWebrtcHost();

        String result = cameraMessageHandler.sendWebRtcPlayMsg(deviceNo, webrtcHost, videoFileName, null);
        log.info("=====> chisj alert video show result = {}", result);
        switch (result) {
            case "-1" :
                return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                        .getMessage("csun.camera.bind.error", null));
            case "-2" :
                return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                        .getMessage("csun.camera.connect.close", null));
            case "-3" :
                return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                        .getMessage("csun.camera.off.line", null));
            case "-4" :
                return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                        .getMessage("client.no.not.bind", null));
        }

        // 推流是否成功
        for (int i= 0; i < 10; i++) {

            // 获取下发录像查看是否成功
            CsunCameraWebrtcPlayAckMsg msg = (CsunCameraWebrtcPlayAckMsg) redisTemplate.opsForValue()
                    .get(RedisKeyUtil.getCsunCameraTask(result));

            if (PublicUtil.isNotEmpty(msg)) {

                Map map = new HashMap();
                map.put("toclientid", deviceNo);
                map.put("host", webrtcHost);
                map.put("conmode", "play");
                map.put("consource", videoFileName);

                return WrapMapper.wrap(Wrapper.SUCCESS_CODE,cmnyMessageSource.getMessage("operation.success", null),map);

            } else{
                log.info("====> chisj msg is null, i = {}", i);
            }

            try {
                Thread.sleep(1000);
            } catch (Exception e) {
                e.printStackTrace();
            }

        }

        log.error("====> chisj alert video show error");

        // 录像播放失败
        return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                .getMessage("camera.alert.video.show.error", null));

    }

    /**
     * 通过webrtc方式查看摄像头视频 -- 厂商
     */
    @RequestMapping(value = "/showByWebRTC", method = RequestMethod.POST)
    public Wrapper showVideoByWebRTC(String deviceNo) {

        Preconditions.checkArgument(PublicUtil.isNotEmpty(deviceNo),
                cmnyMessageSource.getMessage("device.no.empty", null));

        CsunCameraData csunCameraData = (CsunCameraData) redisTemplate
                .opsForValue().get(RedisKeyUtil.getCsunCameraKey(deviceNo));
        if (PublicUtil.isEmpty(csunCameraData)) {
            log.error("===> 守护佳摄像头[{}]尚未绑定...", deviceNo);
            return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                    .getMessage("csun.camera.bind.error", null));
        }

        /**
         * @desc    调试厂商webrtc
         * @author  chisj
         * @date    2020-10-29
         */
        Channel channel = CsunCameraConstant.CAMERA_CHANNEL_MAP.get(deviceNo);
        if (channel != null) {
            if (channel.isActive()) {

            } else {
                return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                        .getMessage("csun.camera.connect.close", null));
            }
        } else {
            log.error("====> csun camera [{}] off line...", deviceNo);
            return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                    .getMessage("csun.camera.off.line", null));
        }

        // 根据摄像头编号查询客户端编号
        DmcCsunCameraWebRtc dmcCsunCameraWebRtc = dmcCsunCameraWebRtcService
                .selectByDeviceId(csunCameraData.getDeviceId());
        if (PublicUtil.isEmpty(dmcCsunCameraWebRtc)) {
            return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                    .getMessage("client.no.not.bind", null));
        }

//        String rtmpUrl = cmnyProperties.getNetty().getCamera().getRtmpUrl() + deviceNo;
        String host = cmnyProperties.getNetty().getCamera().getWebrtcHost();

        Map map = new HashMap();
//        map.put("rtmpUrl", rtmpUrl);

        /**
         * 参考webrtc厂商提供的demo
         * 连接webrtc需要几个参数，同时这几个参数也需要下发给摄像头
         *
         * var toclientid ="RHZL-KVFH-TAX2-00000001";
         * var host ="webrtc.qq-kan.com";
         * var conmode ="live";
         * var consource ="MainStream";
         *
         * toclientid：房间号，用设备编号替换
         * host：服务器
         * conmode：连接模式 live-实时视频 play-录像视频
         * consource：连接资源 live模式-MainStream play模式-录像文件名
         */

        map.put("toclientid", dmcCsunCameraWebRtc.getClientNo());
        map.put("host", host);
        map.put("conmode", "live");
        map.put("consource", "MainStream");

        // return WrapMapper.ok(map);
        return WrapMapper.wrap(Wrapper.SUCCESS_CODE,
                cmnyMessageSource.getMessage("operation.success", null), map);

    }

    /**
     * 摄像头视频
     */
    @RequestMapping(value = "/showVideo", method = RequestMethod.POST)
    public Wrapper showVideo(String deviceNo) {

        /*
        * 2020-02-27
        * by xcr
        * 离线状态下，禁止查看视频
        * */
        CsunCameraData csunCameraData = (CsunCameraData) redisTemplate
                .opsForValue().get(RedisKeyUtil.getCsunCameraKey(deviceNo));
        if (PublicUtil.isEmpty(csunCameraData)) {
            log.error("===> 守护佳摄像头[{}]尚未绑定...", deviceNo);
            return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                    .getMessage("csun.camera.bind.error", null));
        }

        Channel channel = CsunCameraConstant.CAMERA_CHANNEL_MAP.get(deviceNo);
        if (channel != null) {
            if (channel.isActive()) {

            } else {
                return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                        .getMessage("csun.camera.connect.close", null));
            }
        } else {
            log.error("====> csun camera [{}] off line...", deviceNo);
            return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                    .getMessage("csun.camera.off.line", null));
        }

        String rtmpUrl = cmnyProperties.getNetty().getCamera().getRtmpUrl() + deviceNo;

        Map map = new HashMap();
        map.put("rtmpUrl", rtmpUrl);

       // return WrapMapper.ok(map);
        return WrapMapper.wrap(Wrapper.SUCCESS_CODE,cmnyMessageSource.getMessage("operation.success", null),map);
    }

    /**
     * 显示摄像头最近一张图片
     */
    @RequestMapping(value = "/getPicture", method = RequestMethod.POST)
    public Wrapper getPicture(String deviceNo) {

        DmcCsunCameraPicture dmcCsunCameraPicture = dmcCsunCameraPictureService.selectByDeviceNo(deviceNo);

        // 解决摄像头没有照片, 显示默认图片
        if (dmcCsunCameraPicture == null) {
            dmcCsunCameraPicture = new DmcCsunCameraPicture();
            dmcCsunCameraPicture.setDeviceNo(deviceNo);
        }
        dmcCsunCameraPicture.setPictureUrl(cmnyProperties.getNetty().getCamera().getPictureShow() + "?deviceNo=" + deviceNo);

        return WrapMapper.wrap(Wrapper.SUCCESS_CODE,cmnyMessageSource.getMessage("operation.success", null),dmcCsunCameraPicture);
    }

    /**
     * 根据报警Id查看报警视频
     */
    @RequestMapping(value = "/alertVideoShow", method = RequestMethod.POST)
    public Wrapper alertVideoShow(Long alertId) {

        if (PublicUtil.isEmpty(alertId)) {
            return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                    .getMessage("device.alert.id.null", null));
        }

        DmcCsunCameraAlertVideo dmcCsunCameraAlertVideo = dmcCsunCameraAlertVideoService.selectByKey(alertId);
        if (PublicUtil.isEmpty(dmcCsunCameraAlertVideo)) {
            return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                    .getMessage("device.alert.video.null", null));
        }

        String deviceNo = dmcCsunCameraAlertVideo.getDeviceNo();

        // 下发rtmp推流地址
        String videoFileName = dmcCsunCameraAlertVideo.getVideoFileName();
        String rtmpUrl = cmnyProperties.getNetty().getCamera().getRtmpUrl() + videoFileName;

        String result = cameraMessageHandler.sendRtmpPlayMsg(deviceNo, rtmpUrl, videoFileName);
        log.info("=====> chisj alert video show result = {}", result);
        switch (result) {
            case "-1" :
                return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                        .getMessage("csun.camera.bind.error", null));
            case "-2" :
                return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                        .getMessage("csun.camera.connect.close", null));
            case "-3" :
                return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                        .getMessage("csun.camera.off.line", null));
        }

        // 推流是否成功
        for (int i= 0; i < 10; i++) {

            // 获取下发录像查看是否成功
            CsunCameraRtmpPlayAckMsg msg = (CsunCameraRtmpPlayAckMsg) redisTemplate.opsForValue()
                    .get(RedisKeyUtil.getCsunCameraTask(result));

            if (PublicUtil.isNotEmpty(msg)) {

                Map map = new HashMap();
                map.put("rtmpUrl", rtmpUrl);

                return WrapMapper.wrap(Wrapper.SUCCESS_CODE,cmnyMessageSource.getMessage("operation.success", null),map);

            } else{
                log.info("====> chisj msg is null, i = {}", i);
            }

            try {
                Thread.sleep(1000);
            } catch (Exception e) {
                e.printStackTrace();
            }

        }

        log.error("====> chisj alert video show error");

        // 录像播放失败
        return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                .getMessage("camera.alert.video.show.error", null));
    }

    /**
     * 根据报警Id查看报警视频
     */
    @RequestMapping(value = "/alertVideoShowByWebRTC", method = RequestMethod.POST)
    public Wrapper alertVideoShowByWebRTC(Long alertId) {

        if (PublicUtil.isEmpty(alertId)) {
            return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                    .getMessage("device.alert.id.null", null));
        }

        DmcCsunCameraAlertVideo dmcCsunCameraAlertVideo = dmcCsunCameraAlertVideoService.selectByKey(alertId);
        if (PublicUtil.isEmpty(dmcCsunCameraAlertVideo)) {
            return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                    .getMessage("device.alert.video.null", null));
        }

        String deviceNo = dmcCsunCameraAlertVideo.getDeviceNo();

        // 下发webrtc推流地址
        String videoFileName = dmcCsunCameraAlertVideo.getVideoFileName();
//        String rtmpUrl = cmnyProperties.getNetty().getCamera().getRtmpUrl() + videoFileName;
        String webrtcHost = cmnyProperties.getNetty().getCamera().getWebrtcHost();


        // 根据摄像头编号查询客户端编号
        CsunCameraData csunCameraData = (CsunCameraData) redisTemplate
                .opsForValue().get(RedisKeyUtil.getCsunCameraKey(deviceNo));
        DmcCsunCameraWebRtc dmcCsunCameraWebRtc = dmcCsunCameraWebRtcService
                .selectByDeviceId(csunCameraData.getDeviceId());
        if (PublicUtil.isEmpty(dmcCsunCameraWebRtc)) {
            return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                    .getMessage("client.no.not.bind", null));
        }

//        String result = cameraMessageHandler.sendRtmpPlayMsg(deviceNo, rtmpUrl, videoFileName);
        String result = cameraMessageHandler.sendWebRtcPlayMsg(deviceNo, webrtcHost, videoFileName, dmcCsunCameraWebRtc.getClientNo());

        log.info("=====> chisj alert video show result = {}", result);
        switch (result) {
            case "-1" :
                return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                        .getMessage("csun.camera.bind.error", null));
            case "-2" :
                return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                        .getMessage("csun.camera.connect.close", null));
            case "-3" :
                return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                        .getMessage("csun.camera.off.line", null));
            case "-4" :
                return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                        .getMessage("client.no.not.bind", null));
        }

        // 推流是否成功
        for (int i= 0; i < 10; i++) {

            // 获取下发录像查看是否成功
            CsunCameraWebrtcPlayAckMsg msg = (CsunCameraWebrtcPlayAckMsg) redisTemplate.opsForValue()
                    .get(RedisKeyUtil.getCsunCameraTask(result));

            if (PublicUtil.isNotEmpty(msg)) {

                Map map = new HashMap();
                map.put("toclientid", dmcCsunCameraWebRtc.getClientNo());
                map.put("host", webrtcHost);
                map.put("conmode", "play");
                map.put("consource", videoFileName);
//                map.put("rtmpUrl", rtmpUrl);

                return WrapMapper.wrap(Wrapper.SUCCESS_CODE,cmnyMessageSource.getMessage("operation.success", null), map);

            } else{
                log.info("====> chisj msg is null, i = {}", i);
            }

            try {
                Thread.sleep(1000);
            } catch (Exception e) {
                e.printStackTrace();
            }

        }

        log.error("====> chisj alert video show error");

        // 录像播放失败
        return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                .getMessage("camera.alert.video.show.error", null));
    }

    /*
    * 添加不报警区域方案
    * */
    @RequestMapping(value = "/addUnalertAeraPlan", method = RequestMethod.POST)
    public Wrapper addUnalertAeraPlan(@RequestBody UnalertAeraPlanDto dto) {

        if (PublicUtil.isEmpty(dto)) {
            return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                    .getMessage("device.alert.id.null", null));
        }
        int ret = dmcCsunCameraUnalertAreaPlanService.savePlan(dto,getLoginAuthDto());
        return WrapMapper.wrap(Wrapper.SUCCESS_CODE,cmnyMessageSource.getMessage("operation.success", null),ret);
    }

    /*
    * 修改不报警区域方案
    * */
    @RequestMapping(value = "/updateUnalertAeraPlan", method = RequestMethod.POST)
    public Wrapper updateUnalertAeraPlan(@RequestBody UnalertAeraPlanDto dto) {

        if (PublicUtil.isEmpty(dto)) {
            return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                    .getMessage("device.alert.id.null", null));
        }
        int ret = dmcCsunCameraUnalertAreaPlanService.savePlan(dto,getLoginAuthDto());
        return WrapMapper.wrap(Wrapper.SUCCESS_CODE,cmnyMessageSource.getMessage("operation.success", null),ret);
    }

    /*
    * 选择不报警区域方案
    * */
    @RequestMapping(value = "/useUnalertAeraPlan/{planId}", method = RequestMethod.POST)
    public Wrapper useUnalertAeraPlan(@PathVariable Long planId) {

        if (PublicUtil.isEmpty(planId)) {
            return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                    .getMessage("device.alert.id.null", null));
        }
        int ret = dmcCsunCameraUnalertAreaPlanService.choosePlanToCamera(planId);
        return WrapMapper.wrap(Wrapper.SUCCESS_CODE,cmnyMessageSource.getMessage("operation.success", null),ret);
    }

    /*
    * 查询方案列表
    * */
    @RequestMapping(value = "/listUnalertAeraPlan/{deviceId}", method = RequestMethod.POST)
    public Wrapper listUnalertAeraPlan(@PathVariable Long deviceId) {
        if (PublicUtil.isEmpty(deviceId)) {
            return WrapMapper.wrap(Wrapper.ERROR_CODE, cmnyMessageSource
                    .getMessage("device.alert.id.null", null));
        }
        List<UnalertAeraPlanVO> voList = dmcCsunCameraUnalertAreaPlanService.listUnalertAeraPlan(deviceId);
        return WrapMapper.wrap(Wrapper.SUCCESS_CODE,cmnyMessageSource.getMessage("operation.success", null),voList);
    }

    /**
     * @author  chisj
     * @date    2020-01-07
     * @desc    查询机构摄像头列表
     */
    @RequestMapping(value = "/selectGroupCamera", method = RequestMethod.POST)
    public Wrapper selectGroupCamera() {

        List<GroupCameraVo> groupCameraVoList = dmcDeviceService.selectGroupCamera();

        return WrapMapper.wrap(Wrapper.SUCCESS_CODE,
                cmnyMessageSource.getMessage("operation.success", null),
                groupCameraVoList);
    }

    /**
     * @author  chisj
     * @date    2020-01-07
     * @desc    获取获取webrtc信息
     */
    @RequestMapping(value = "/selectWebRtcDown", method = RequestMethod.POST)
    public Wrapper selectWebRtcDown(String mac) {

        // 判断是否开启该功能
        Object _switch = redisTemplate.opsForValue()
                .get(RedisKeyUtil.getCsunCameraDownSwitch());

        Boolean flag = false;
        if (PublicUtil.isEmpty(_switch)) {
            _switch = false;
        } else {
            flag = (Boolean) _switch;
        }

        if (!flag) {
            return WrapMapper.wrap(Wrapper.ERROR_CODE,
                    cmnyMessageSource.getMessage("function.video.download.not.open",null),
                    null);
        }

        // 判断mac是否在列表中
        DmcWebRtcMac dmcWebRtcMac = new DmcWebRtcMac();
        dmcWebRtcMac.setMac(mac);
        int count = dmcWebRtcMacService.selectCount(dmcWebRtcMac);
        if (count == 0) {
            return WrapMapper.wrap(Wrapper.ERROR_CODE,
                    cmnyMessageSource.getMessage("mac.not.legal",null),
                    null);
        }

        Map<String, Object> map = Maps.newHashMap();
        map.put("host", cmnyProperties.getNetty().getCamera().getWebrtcHost());
        map.put("username", "username");
        map.put("password", "password");

        return WrapMapper.wrap(Wrapper.SUCCESS_CODE,
                cmnyMessageSource.getMessage("operation.success", null),
                map);
    }

    /**
     * @author  chisj
     * @date    2020-01-07
     * @desc    查询录像下载开关
     */
    @RequestMapping(value = "/getDownSwitch", method = RequestMethod.POST)
    public Wrapper getDownSwitch() {

        Object _switch = redisTemplate.opsForValue()
                .get(RedisKeyUtil.getCsunCameraDownSwitch());

        if (PublicUtil.isEmpty(_switch)) {
            _switch = false;
        }

        Map<String, Object> map = Maps.newHashMap();
        map.put("_switch", _switch);

        return WrapMapper.wrap(Wrapper.SUCCESS_CODE,
                cmnyMessageSource.getMessage("operation.success", null),
                map);
    }

    /**
     * @author  chisj
     * @date    2020-01-07
     * @desc    设置录像下载开关
     */
    @RequestMapping(value = "/setDownSwitch", method = RequestMethod.POST)
    public Wrapper setDownSwitch(Boolean _switch) {

        redisTemplate.opsForValue().set(RedisKeyUtil.getCsunCameraDownSwitch(), _switch);

        return WrapMapper.wrap(Wrapper.SUCCESS_CODE,
                cmnyMessageSource.getMessage("operation.success", null),
                null);
    }

}
